#include "rectangulo.h"
//--------------------------------------------------------------------------------------------/

rectangulo::rectangulo(char* IDFigura) : figura(IDFigura){
	this->tipo = RECTANGULO;
}

//--------------------------------------------------------------------------------------------/

rectangulo::rectangulo(textura* tex, color* colorRelleno, color* colorBorde) :	figura(tex,colorRelleno,colorBorde), ancho(0), alto(0) {
	this->tipo = RECTANGULO;
}
//--------------------------------------------------------------------------------------------/

rectangulo::rectangulo(punto puntoInicial, float ancho, float alto, textura* tex, color* colorRelleno, color* colorBorde) :	figura(tex,colorRelleno,colorBorde), ancho(ancho), alto(alto)
{
	this->puntoInicial.setX(puntoInicial.getX());
	this->puntoInicial.setY(puntoInicial.getY() - alto);
	this->tipo = RECTANGULO;
}
//--------------------------------------------------------------------------------------------/

void rectangulo::setPuntoInicial(punto pInicial)
{
	this->puntoInicial.setX(pInicial.getX());
	this->puntoInicial.setY(pInicial.getY() - alto);
}
//--------------------------------------------------------------------------------------------/

void rectangulo::setAncho(float ancho)
{
	this->ancho = ancho;
}
//--------------------------------------------------------------------------------------------/

void rectangulo::setAlto(float alto)
{
	this->alto = alto;
}
//--------------------------------------------------------------------------------------------/

punto& rectangulo::getPuntoInicial()
{
	return puntoInicial;
}
//--------------------------------------------------------------------------------------------/

float rectangulo::getAncho()
{
	return ancho;
}
//--------------------------------------------------------------------------------------------/

float rectangulo::getAlto()
{
	return alto;
}
//--------------------------------------------------------------------------------------------/

//funcion para dibujar una linea
void graficarLineaRectangulo(SDL_Surface* screen, punto puntoInicial, punto puntoFinal,color color)
{

	punto unPunto;
	int errorEnX,errorEnY, tamanio, cantidad,
	VerX, VerY, xInicial, yInicial, xFinal, yFinal,diferencialX, diferencialY;

	xInicial = (int)puntoInicial.getX();
	xFinal = (int)puntoFinal.getX();
	yInicial = (int)puntoInicial.getY();
	yFinal =(int) puntoFinal.getY();

	diferencialX = xFinal - xInicial;
	diferencialY = yFinal - yInicial;

	if (diferencialX > 0)
		VerX = 1;
	else if (diferencialX == 0)
		VerX = 0;
	else
		VerX = -1;

	if (diferencialY > 0)
		VerY = 1;
	else if (diferencialY == 0)
		VerY = 0;
	else
		VerY = -1;

	diferencialX = abs(diferencialX);
	diferencialY = abs(diferencialY);

	if (diferencialX > diferencialY)
		tamanio = diferencialX;
	else
		tamanio = diferencialY;

	errorEnX = 0;
	errorEnY = 0;

	for (cantidad = 0; cantidad <= tamanio+1; cantidad++)
	{

		unPunto.ponerUnPixel(screen, xInicial, yInicial, color);

		errorEnX =errorEnX + diferencialX;
		errorEnY =errorEnY + diferencialY;

		if (errorEnX > tamanio) 
		{
			xInicial = xInicial + VerX;
			errorEnX =errorEnX - tamanio;

		}
		if (errorEnY > tamanio) 
		{
			yInicial = yInicial + VerY;
			errorEnY =errorEnY- tamanio;

		}
	}
}

//--------------------------------------------------------------------------------------------/
void rectangulo::graficarRellenoRectangulo()
{

	SDL_Surface* screen = pantalla::getPantalla();
	//rellena un rectangulo
	if(this->tex == NULL){
		SDL_Rect rellenoRectangulo;
		Uint32 colorRellenoFigura=SDL_MapRGB(screen->format, colorRellenoGrafico->getRojo(),colorRellenoGrafico->getVerde(), colorRellenoGrafico->getAzul());
		rellenoRectangulo.x=(int)puntoInicial.getX();
		rellenoRectangulo.y=(int)puntoInicial.getY();
		rellenoRectangulo.h=(int)alto;
		rellenoRectangulo.w=(int)ancho;
		SDL_FillRect(screen,&rellenoRectangulo,colorRellenoFigura);
		SDL_UpdateRect(screen,rellenoRectangulo.x,rellenoRectangulo.y,rellenoRectangulo.w,rellenoRectangulo.h);
	} else {
		graficarRectanguloConTextura();
	}

}

//--------------------------------------------------------------------------------------------/

//dibujo el rectangulo o cuadrado
void rectangulo::algoritmoGraficar()
{
	SDL_Surface* screen = pantalla::getPantalla();
	graficarRellenoRectangulo();

	punto desde,hasta;

	desde.setX(puntoInicial.getX());
	desde.setY(puntoInicial.getY());
	hasta.setY(puntoInicial.getY()+alto);
	hasta.setX(puntoInicial.getX());
	graficarLineaRectangulo(screen,hasta,desde,*colorBordeGrafico);

	desde.setX(puntoInicial.getX());
	desde.setY(puntoInicial.getY());
	hasta.setY(puntoInicial.getY());
	hasta.setX(puntoInicial.getX()+ancho);
	graficarLineaRectangulo(screen,hasta,desde,*colorBordeGrafico);

	desde.setX(puntoInicial.getX()+ancho);
	desde.setY(puntoInicial.getY());
	hasta.setY(puntoInicial.getY()+alto );
	hasta.setX(puntoInicial.getX()+ancho);
	graficarLineaRectangulo(screen,hasta,desde,*colorBordeGrafico);

	desde.setX(puntoInicial.getX());
	desde.setY(puntoInicial.getY()+alto);
	hasta.setY(puntoInicial.getY()+alto);
	hasta.setX(puntoInicial.getX()+ancho);
	graficarLineaRectangulo(screen,hasta,desde,*colorBordeGrafico);
}
//--------------------------------------------------------------------------------------------/

rectangulo::~rectangulo() {}
//--------------------------------------------------------------------------------------------/

void rectangulo::graficarRectanguloConTextura ()
{
	int x=(int)puntoInicial.getX();
	int y=(int)puntoInicial.getY();
	int h=(int)alto;
	int b=(int)ancho;
	color col;
	SDL_Surface* screen = pantalla::getPantalla();
	bitmap* imagen = this->tex->getImagen();
	imagen->modificarImagen(b,h);
	SDL_Surface* textura = imagen->getImage();
	for ( int posY = y ; posY < (y + h) ; posY++ ){
		for ( int posX = x ; posX < (x + b) ; posX++ )
		{
			sdlHelper::getPixel ( textura , posX - x , posY - y , col );
			sdlHelper::drawPixel ( screen , posX , posY ,col );
		}
	}
	sdlHelper::flip(screen);
}

SocketRectangulo rectangulo::getEstructuraSocket(){
	SocketRectangulo rectangulo;
	rectangulo.puntoInicial.setX(this->puntoInicial.getX());
	rectangulo.puntoInicial.setY(this->puntoInicial.getY());
	rectangulo.ancho= ancho;
	rectangulo.alto = alto;
	if (this->colorBordeGrafico != NULL) {
		rectangulo.colorBordeGrafico.setAzul(this->colorBordeGrafico->getAzul());
		rectangulo.colorBordeGrafico.setRojo(this->colorBordeGrafico->getRojo());
		rectangulo.colorBordeGrafico.setVerde(this->colorBordeGrafico->getVerde());
	} else {
		rectangulo.colorBordeGrafico.setAzul(0);
		rectangulo.colorBordeGrafico.setRojo(0);
		rectangulo.colorBordeGrafico.setVerde(255);
	}
	if (this->colorBordeGrafico != NULL) {
		rectangulo.colorRellenoGrafico.setAzul(this->colorRellenoGrafico->getAzul());
		rectangulo.colorRellenoGrafico.setRojo(this->colorRellenoGrafico->getRojo());
		rectangulo.colorRellenoGrafico.setVerde(this->colorRellenoGrafico->getVerde());
	} else {
		rectangulo.colorBordeGrafico.setAzul(255);
		rectangulo.colorBordeGrafico.setRojo(0);
		rectangulo.colorBordeGrafico.setVerde(0);
	}
	
	if(this->getTextura() != NULL){
		rectangulo.textura=this->getTextura()->getImagen()->getPath().length();
	} else {
		rectangulo.textura=0;
	}
	return rectangulo;
}